`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2022/06/16 14:38:10
// Design Name: 
// Module Name: mux4x32
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////

module mux2w#(parameter  WIDTH=32)(
    input [WIDTH-1:0] d0,
    input [WIDTH-1:0] d1,
    input  sel,
    output reg [WIDTH-1:0] dout
    );
    
    always @(*)   //It includes all Inputs. You can use this instead of specifying all inputs in //sensivity list.Verilog-2001 Feature
    begin
       case ({sel})
       1'b0 : dout = d0;
       1'b1 : dout = d1;
       endcase
    end
endmodule

module mux4w#(parameter  WIDTH=32)(
    input [WIDTH-1:0] d0,
    input [WIDTH-1:0]  d1,
    input [WIDTH-1:0]  d2,
    input [WIDTH-1:0]  d3,
    input [1:0] sel,
    output reg [WIDTH-1:0]  dout
    );
    
    always @(*)   //It includes all Inputs. You can use this instead of specifying all inputs in //sensivity list.Verilog-2001 Feature
    begin
       case ({sel})
       2'b00 : dout = d0;
       2'b01 : dout = d1;
       2'b10 : dout = d2;
       2'b11 : dout = d3;
       endcase
    end
endmodule
module mux8w#(parameter  WIDTH=32)(
    input [WIDTH-1:0] d0,
    input [WIDTH-1:0] d1,
    input [WIDTH-1:0] d2,
    input [WIDTH-1:0] d3,
    input [WIDTH-1:0] d4,
    input [WIDTH-1:0] d5,
    input [WIDTH-1:0] d6,
    input [WIDTH-1:0] d7,
    
    input [2:0] sel,
    output reg [WIDTH-1:0] dout
    );
    
    always @(*)   //It includes all Inputs. You can use this instead of specifying all inputs in //sensivity list.Verilog-2001 Feature
    begin
       case ({sel})
       3'b000 : dout = d0;
       3'b001 : dout = d1;
       3'b010 : dout = d2;
       3'b011 : dout = d3;
       3'b100 : dout = d4;
       3'b101 : dout = d5;
       3'b110 : dout = d6;
       3'b111 : dout = d7;
       endcase
    end
endmodule

module mux16w#(parameter  WIDTH=32)(
    input [WIDTH-1:0] d0,
    input [WIDTH-1:0] d1,
    input [WIDTH-1:0] d2,
    input [WIDTH-1:0] d3,
    input [WIDTH-1:0] d4,
    input [WIDTH-1:0] d5,
    input [WIDTH-1:0] d6,
    input [WIDTH-1:0] d7,

    input [WIDTH-1:0] d8,
    input [WIDTH-1:0] d9,
    input [WIDTH-1:0] d10,
    input [WIDTH-1:0] d11,
    input [WIDTH-1:0] d12,
    input [WIDTH-1:0] d13,
    input [WIDTH-1:0] d14,
    input [WIDTH-1:0] d15,
    input [3:0] sel,
    output reg [WIDTH-1:0] dout
    );


    always @(*)   //It includes all Inputs. You can use this instead of specifying all inputs in //sensivity list.Verilog-2001 Feature
    begin
       case ({sel})
       4'b0000 : dout = d0;
       4'b0001 : dout = d1;
       4'b0010 : dout = d2;
       4'b0011 : dout = d3;
       4'b0100 : dout = d4;
       4'b0101 : dout = d5;
       4'b0110 : dout = d6;
       4'b0111 : dout = d7;

       4'b1000 : dout = d8;
       4'b1001 : dout = d9;
       4'b1010 : dout = d10;
       4'b1011 : dout = d11;
       4'b1100 : dout = d12;
       4'b1101 : dout = d13;
       4'b1110 : dout = d14;
       4'b1111 : dout = d15;
       endcase
    end
endmodule

module mux32w#(parameter  WIDTH=32)(
    input [WIDTH-1:0] d0,
    input [WIDTH-1:0] d1,
    input [WIDTH-1:0] d2,
    input [WIDTH-1:0] d3,
    input [WIDTH-1:0] d4,
    input [WIDTH-1:0] d5,
    input [WIDTH-1:0] d6,
    input [WIDTH-1:0] d7,

    input [WIDTH-1:0] d8,
    input [WIDTH-1:0] d9,
    input [WIDTH-1:0] d10,
    input [WIDTH-1:0] d11,
    input [WIDTH-1:0] d12,
    input [WIDTH-1:0] d13,
    input [WIDTH-1:0] d14,
    input [WIDTH-1:0] d15,

    input [WIDTH-1:0] d16,
    input [WIDTH-1:0] d17,
    input [WIDTH-1:0] d18,
    input [WIDTH-1:0] d19,
    input [WIDTH-1:0] d20,
    input [WIDTH-1:0] d21,
    input [WIDTH-1:0] d22,
    input [WIDTH-1:0] d23,

    input [WIDTH-1:0] d24,
    input [WIDTH-1:0] d25,
    input [WIDTH-1:0] d26,
    input [WIDTH-1:0] d27,
    input [WIDTH-1:0] d28,
    input [WIDTH-1:0] d29,
    input [WIDTH-1:0] d30,
    input [WIDTH-1:0] d31,
    
    input [4:0] sel,
    output reg [WIDTH-1:0] dout
    );


    always @(*)   //It includes all Inputs. You can use this instead of specifying all inputs in //sensivity list.Verilog-2001 Feature
    begin
       case ({sel})
       5'b00000 : dout = d0;
       5'b00001 : dout = d1;
       5'b00010 : dout = d2;
       5'b00011 : dout = d3;
       5'b00100 : dout = d4;
       5'b00101 : dout = d5;
       5'b00110 : dout = d6;
       5'b00111 : dout = d7;

       5'b01000 : dout = d8;
       5'b01001 : dout = d9;
       5'b01010 : dout = d10;
       5'b01011 : dout = d11;
       5'b01100 : dout = d12;
       5'b01101 : dout = d13;
       5'b01110 : dout = d14;
       5'b01111 : dout = d15;

       5'b10000 : dout = d16;
       5'b10001 : dout = d17;
       5'b10010 : dout = d18;
       5'b10011 : dout = d19;
       5'b10100 : dout = d20;
       5'b10101 : dout = d21;
       5'b10110 : dout = d22;
       5'b10111 : dout = d23;

       5'b11000 : dout = d24;
       5'b11001 : dout = d25;
       5'b11010 : dout = d26;
       5'b11011 : dout = d27;
       5'b11100 : dout = d28;
       5'b11101 : dout = d29;
       5'b11110 : dout = d30;
       5'b11111 : dout = d31;       
       endcase
    end
endmodule